import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
//学生表https://gitee.com/lizheeeeeeee/hbase_student/blob/master/src/test/java/Student.java
public class Zuoye2_0 {
    public static Connection conn = null;
    public static TableName tName = TableName.valueOf("t_student");
    public static Random ra = new Random();
    //建立连接   3.7.4.Zookeeper集群所起作用
    //存放整个HBase集群的元数据以及集群的状态信息。
    //实现HMaster主从节点的failover。
    //注： HMaster通过监听ZooKeeper中的Ephemeral节点(默认：/hbase/rs/*)来监控HRegionServer的加入和宕机。
    //在第一个HMaster连接到ZooKeeper时会创建Ephemeral节点(默认：/hbasae/master)来表示Active的HMaster，
    // 其后加进来的HMaster则监听该Ephemeral节点
    //如果当前Active的HMaster宕机，则该节点消失，因而其他HMaster得到通知，而将自身转换成Active的HMaster，
    // 在变为Active的HMaster之前，它会在/hbase/masters/下创建自己的Ephemeral节点。
    @Before// 前置通知, 在方法执行之前执行
    public void init() throws IOException {
        Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "hbase:2181,hbase1:2181,hbase2:2181");
        conn = ConnectionFactory.createConnection(conf);
    }
    @Test
    public void create() throws IOException{
        //从连接中构造一个DDL操作器
        Admin admin = conn.getAdmin();
        //if语句  如果表存在，禁用删除表
        if(admin.tableExists(tName)){
            admin.disableTable(tName);
            admin.deleteTable(tName);
        }
        //创建一个表定义描述对象
        HTableDescriptor ht = new HTableDescriptor(tName);
        //创建列族定义描述对象
        HColumnDescriptor hc = new HColumnDescriptor("cf1".getBytes());
        hc.setMaxVersions(5);
        hc.setBlockCacheEnabled(true);
        hc.setBlocksize(180000);

        //将列族定义信息对象放入表定义对象中
        ht.addFamily(hc);
        //用DDL操作器对象：admin来建表
        admin.createTable(ht);
        System.out.println("表创建完成");
    }
    //text注解只能在text下写，不能在main里写
    @Test
    //插入数据的设计
    public void insert() throws IOException{
        Table table = conn.getTable(tName);
        List<Put> putList = new ArrayList<Put>();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for(int i=1;i<20;i++){
            String id=format.format(new Date());
            id=id.replace("-", "").replace(" ", "").replace(":", "");
            id = "student"+getRowKey(id);
            Put put = new Put(id.getBytes());
            String name="Tom"+i;
            put.addColumn("cf1".getBytes(), "name".getBytes(), name.getBytes());
            putList.add(put);
        }
        table.put(putList);
        System.out.println("数据插入完成");
    }

    @After//后置通知, 在方法执行之后执行 。关闭连接
    public void after() throws IOException {
        if(conn!=null){
            conn.close();
        }
    }
    //行键 ID + “” + 随机数（0—99999）
    private String getRowKey(String id){
        return id+""+ra.nextInt(99999);
    }
}
/**
 hbase(main):008:0> scan 't_student'
 ROW                                                  COLUMN+CELL
 student2019010709574012207                          column=cf1:name, timestamp=1546826308736, value=Tom14
 student2019010709574037508                          column=cf1:name, timestamp=1546826308736, value=Tom10
 student2019010709574038144                          column=cf1:name, timestamp=1546826308736, value=Tom5
 student2019010709574049053                          column=cf1:name, timestamp=1546826308736, value=Tom13
 student2019010709574052755                          column=cf1:name, timestamp=1546826308736, value=Tom3
 student2019010709574053841                          column=cf1:name, timestamp=1546826308736, value=Tom6
 student2019010709574059859                          column=cf1:name, timestamp=1546826308736, value=Tom9
 student2019010709574061073                          column=cf1:name, timestamp=1546826308736, value=Tom1
 student2019010709574061577                          column=cf1:name, timestamp=1546826308736, value=Tom2
 student2019010709574065426                          column=cf1:name, timestamp=1546826308736, value=Tom11
 student2019010709574071630                          column=cf1:name, timestamp=1546826308736, value=Tom12
 student201901070957407362                           column=cf1:name, timestamp=1546826308736, value=Tom18
 student2019010709574077493                          column=cf1:name, timestamp=1546826308736, value=Tom19
 student2019010709574078487                          column=cf1:name, timestamp=1546826308736, value=Tom17
 student2019010709574080330                          column=cf1:name, timestamp=1546826308736, value=Tom4
 student2019010709574082082                          column=cf1:name, timestamp=1546826308736, value=Tom15
 student201901070957408538                           column=cf1:name, timestamp=1546826308736, value=Tom7
 student2019010709574091264                          column=cf1:name, timestamp=1546826308736, value=Tom8
 student2019010709574095005                          column=cf1:name, timestamp=1546826308736, value=Tom16
 **/